草庐IT

c - WaitForMultipleObjects 堆栈

全部标签

linux - 为什么 gcc 4.x 在调用方法时默认为 linux 上的堆栈保留 8 个字节?

作为asm的初学者,我正在查看gcc-S生成的asm代码来学习。为什么gcc4.x在调用方法时默认为堆栈保留8个字节?func18是空函数,没有返回值,没有参数,没有定义局部变量。我不明白为什么这里保留8个字节(任何论坛/网站都没有提及原因,人们似乎认为这是理所当然的)是为了%ebp只是推送吗?或返回类型?!非常感谢!.globl_func18_func18:pushl%ebpmovl%esp,%ebpsubl$8,%esp.text 最佳答案 一些指令要求某些数据类型与16字节边界对齐(特别是SSE数据类型__m128)。为了满足

linux - 为什么 gcc 4.x 在调用方法时默认为 linux 上的堆栈保留 8 个字节?

作为asm的初学者,我正在查看gcc-S生成的asm代码来学习。为什么gcc4.x在调用方法时默认为堆栈保留8个字节?func18是空函数,没有返回值,没有参数,没有定义局部变量。我不明白为什么这里保留8个字节(任何论坛/网站都没有提及原因,人们似乎认为这是理所当然的)是为了%ebp只是推送吗?或返回类型?!非常感谢!.globl_func18_func18:pushl%ebpmovl%esp,%ebpsubl$8,%esp.text 最佳答案 一些指令要求某些数据类型与16字节边界对齐(特别是SSE数据类型__m128)。为了满足

c - 进程终止后如何查看堆栈跟踪?

我正在使用gdb命令“附加”来调试进程但是在进程崩溃(sigkill)之后我看不到堆栈跟踪(gdb中的“bt”命令):(gdb)BT没有堆栈。进程终止后如何查看堆栈跟踪? 最佳答案 通过确保ulimit-c不显示核心大小为0,将您的shell设置为转储核心。如果显示为0,则运行ulimit-cunlimited.接下来,重新运行您的程序,直到它崩溃并转储核心,然后调用:gdb/path/to/executable/path/to/core并键入bt以获取堆栈跟踪。此外,您还需要在打开调试信息的情况下编译可执行文件。如果您使用的是gc

c - 进程终止后如何查看堆栈跟踪?

我正在使用gdb命令“附加”来调试进程但是在进程崩溃(sigkill)之后我看不到堆栈跟踪(gdb中的“bt”命令):(gdb)BT没有堆栈。进程终止后如何查看堆栈跟踪? 最佳答案 通过确保ulimit-c不显示核心大小为0,将您的shell设置为转储核心。如果显示为0,则运行ulimit-cunlimited.接下来,重新运行您的程序,直到它崩溃并转储核心,然后调用:gdb/path/to/executable/path/to/core并键入bt以获取堆栈跟踪。此外,您还需要在打开调试信息的情况下编译可执行文件。如果您使用的是gc

c - 堆栈溢出发生前剩余堆栈的大小

在Linux上,使用C,假设我有一个动态确定的n命名我必须存储在数组中的元素数量(intmy_array[n])只是在很短的时间内,比如一个函数调用,被调用函数只使用很少的内存(大约一百字节)。大部分n很少,大约十分之一。但有时n可能很大,多达1000或1'000'000。如何计算,我的堆栈是否可以容纳n*o+p个字节而不溢出?基本上:我的堆栈中还剩下多少字节? 最佳答案 的确,checkingavailablestack问题给出了很好的答案。但更务实的答案是:不要在调用堆栈上分配大数据。在您的情况下,您可以以不同方式处理n时的情况

c - 堆栈溢出发生前剩余堆栈的大小

在Linux上,使用C,假设我有一个动态确定的n命名我必须存储在数组中的元素数量(intmy_array[n])只是在很短的时间内,比如一个函数调用,被调用函数只使用很少的内存(大约一百字节)。大部分n很少,大约十分之一。但有时n可能很大,多达1000或1'000'000。如何计算,我的堆栈是否可以容纳n*o+p个字节而不溢出?基本上:我的堆栈中还剩下多少字节? 最佳答案 的确,checkingavailablestack问题给出了很好的答案。但更务实的答案是:不要在调用堆栈上分配大数据。在您的情况下,您可以以不同方式处理n时的情况

c - Linux 中的可执行堆栈示例(i386 架构)

我发现当我们使用nestedfunctions时,GCC需要trampolinecode的可执行堆栈.但是,以下代码在使用gcc编译时不会显示可执行堆栈。(我用execstack来验证堆栈是否可执行)#include#includeintmain(){intadd(inta,intb){returna+b;}returnadd(2,3);}为什么这不会产生可执行堆栈?如果它不应该,那么有人可以举例说明确实提供可执行堆栈的代码结构吗? 最佳答案 如果嵌套函数根本不依赖于其“父”的堆栈,那么它只是一个普通函数-嵌套是语法(和作用域)糖。

c - Linux 中的可执行堆栈示例(i386 架构)

我发现当我们使用nestedfunctions时,GCC需要trampolinecode的可执行堆栈.但是,以下代码在使用gcc编译时不会显示可执行堆栈。(我用execstack来验证堆栈是否可执行)#include#includeintmain(){intadd(inta,intb){returna+b;}returnadd(2,3);}为什么这不会产生可执行堆栈?如果它不应该,那么有人可以举例说明确实提供可执行堆栈的代码结构吗? 最佳答案 如果嵌套函数根本不依赖于其“父”的堆栈,那么它只是一个普通函数-嵌套是语法(和作用域)糖。

c - 堆栈旁边的线程有什么用

在Linux进程中,每个线程都有自己的堆栈。除此之外,每个线程还有什么是本地的。我已经阅读了文件分配表等内容......有人可以向我提供特定于线程的内容列表以及它们在内存中的排列方式。其次,我注意到当我为一个线程分配一个堆栈时(见下面的代码),线程函数中第一个变量的地址在我分配的堆栈地址(stackAddr)。我认为这是因为栈顶是分配的堆栈内存的结束地址,因为局部变量地址和分配的堆栈的值的差异大约是堆栈的大小(STACKSIZE)。换句话说,它看起来像是从底部向顶部生长。pthread_attr_init(&attr[tid]);stackAddr=malloc(STACKSIZE);

c - 堆栈旁边的线程有什么用

在Linux进程中,每个线程都有自己的堆栈。除此之外,每个线程还有什么是本地的。我已经阅读了文件分配表等内容......有人可以向我提供特定于线程的内容列表以及它们在内存中的排列方式。其次,我注意到当我为一个线程分配一个堆栈时(见下面的代码),线程函数中第一个变量的地址在我分配的堆栈地址(stackAddr)。我认为这是因为栈顶是分配的堆栈内存的结束地址,因为局部变量地址和分配的堆栈的值的差异大约是堆栈的大小(STACKSIZE)。换句话说,它看起来像是从底部向顶部生长。pthread_attr_init(&attr[tid]);stackAddr=malloc(STACKSIZE);